﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Banco;
using ObjetoNegocio;

namespace RegraNegocio
{
    public class RegraNegocioAvaliacao
    {
        public void Cadastrar(Avaliacao algoritmo)
        {
            var AvaliacaoBD = new AvaliacaoBD();
            AvaliacaoBD.Inserir(algoritmo);
        }

        public Avaliacao Pesquisar(Avaliacao algoritmo)
        {
            var avaliacaoBD = new AvaliacaoBD();
            return avaliacaoBD.Pesquisar(algoritmo);
        }

        public List<Avaliacao> ListarPorFiltro(Avaliacao algoritmo)
        {
            var avaliacaoBD = new AvaliacaoBD();
            return avaliacaoBD.ListarPorFiltro(algoritmo);
        }

        public List<Algoritmo> Recomendar(Busca busca,Usuario usuario)
        {
            var avaliacaoBD = new AvaliacaoBD();
            var avaliacoes = avaliacaoBD.Listar();

            var algoritmosAvaliadosBemPorUsuario = from avaliacao in avaliacoes
                                       where avaliacao.Busca.MesmoParametros(busca) 
                                       && avaliacao.Usuario.Equals(usuario) 
                                       && avaliacao.Gostou
                                       select avaliacao.Algoritmo;

            var temp = algoritmosAvaliadosBemPorUsuario.ToList();

            var usuarios = from avaliacao in avaliacoes
                           where algoritmosAvaliadosBemPorUsuario.Contains(avaliacao.Algoritmo) &&
                                 avaliacao.Busca.MesmoParametros(busca) && avaliacao.Gostou
                                 && !avaliacao.Usuario.Equals(usuario)
                           select avaliacao.Usuario;

            var temp_usuers = usuarios.ToList();

            var users = usuarios.Distinct().ToList();

            var algoritmosRecomendados = from avaliacao in avaliacoes
                                         where users.Contains(avaliacao.Usuario) && avaliacao.Gostou
                                         select avaliacao.Algoritmo;
    


            return algoritmosRecomendados.Distinct().ToList();
        }
    }
}
